SBS_01 构造系统概述

1 什么是构造系统

  • 对编译型语言进行编译(比如 c、c++)
  • 对解释型语言进行打包和编译(比如 perl、python)
  • 对 web 应用进行编译和打包(JSP、ASP、PHP、Vue、AngularJS、ReactJS)
  • 执行单元测试
  • 静态分析
  • 生成 PDF 或 HTML 文档

1.1 编译型语言

  • 版本控制工具:CVS、SVN、Git
  • 源树和目标树:指某个特定开发人员处理的源文件集合和编译后的目标文件集合。
  • 编译工具:c、java的编译器、文档生成器、单元测试生成器
  • 构造机器:指计算机设备,编译工具在这些机器上执行
  • 发布打包和目标机器:软件打包、分发给最终用户、在目标机器安装的方法。

编译型语言的传统构造系统示意图

1.2 解释型语言

解释型语言的源代码不用编译成目标代码,因此无须目标树。

解释型语言的构造系统示意图

1.3 web应用

用于 web 应用的构造系统是一种混合体,包含编译型代码、解释型代码以及配置文件和数据文件。

  • 静态 HTML 文件
  • JSP、ASP、PHP 页面
  • Java 源文件

web 应用软件的构造系统示意图

1.4 单元测试

事实上,单元测试构造系统只是标准构造系统的变体。这种构造系统不生成可在目标机器上安装的发布包,而是生成许多更小的单元测试包。

生成单元测试包的构造系统示意图

1.5 静态分析

与常规构造系统类似,静态分析系统的输入也是同样是源代码。不过,它不生成 目标树发布包,而是输出某种类型的缺陷报告文档。

用于静态分析的构造系统示意图

1.6 文档生成

该构造系统的输出是 PDF 文件,或是 HTML 页面和图形图像的集合,或是任何其他可视为文档的东西。

生成文档的构造系统示意图

2 构造系统的各个组成部分

2.1 版本控制工具

  • 获取源代码拷贝
  • 检入、提交
  • 多重代码流
  • 查阅老版本

2.2 源树与目标树

说明

  • 源树:程序源文件的目录结构
  • 目标树: 目标文件的目录结构

价值:

  • 可读性
  • 源代码控制
  • 性能

2.3 编译工具和构造工具

构造工具 -> 编译工具 -> 编译器

编译器:一般用来把高级编程语言代码转译成目标代码。
编译工具:指任何可以输入数据转换成输出数据的工具。
构造工具:所处的层面比编译工具更高,会调用必要的编译工具,来生成最终的构造输出结果。

常见编译工具

  • c 编译器
  • 链接器
  • UML 代码生成器
  • 文档生成器
  • 用于创建目录的命令行工具

2.4 构造机器

  • 原生编译(native compilation):软件的构造运行,在同类的机器上。
  • 跨平台编译(cross-compilation):软件的构造运行,是分别在不同操作系统或不同 cpu 的两类机器上进行的。

2.5 发布打包与目标机器

直接把一堆可执行程序和数据文件交给用户,指望他们能够自行安装和配置,这种想法是不现实的。

特点

  • 单个文件
  • 进行压缩,以减少下载时间
  • 把不相干的调试信息去掉

常见打包和安装

  • 归档文件
  • 打包管理工具(.rpm、.deb 等)
  • 定制的图形用户界面(GUI)安装工具

3 构造过程和构造描述

构造过程

构造工具调用各个编译工具来完成一连串事件,这个过程就是所谓的构造过程(build process)。

面向编译型语言的构造系统示意图

构造描述

对构造工具来说,需要以文本格式编写构造描述(build description)。

以 SCons 的构造描述文件为例

1
Progam("stock", ["ticker.c", "currency.c"])

4 如何使用构造系统

根据构造的频度和构造的程序的用途,可以分三种使用场景:

  • 开发人员(或本地)构造:每次对代码进行修改后对软件进行增量式的重新编译,生成的发布包仅用于开发人员本地调试。
  • 发布构造:软件开发到测试阶段,向测试小组提供的完整的团建包,经过测试确信没有质量问题后就提交给客户。
  • 健全性构造:用来判断当前源码是否 “健全”,能够正确无误地进行构造。每天可以进行过次,一般是全自动进行的。许多开发人员使用 每日构造(daily build)每夜构造来描述这种场景。

构造管理工具

说明:构造管理工具是在现有构造系统之上的另一个管理层,而不是构造系统本身,好的构造管理工具应当提供以下特性:

  • 根据预先确定的计划安排,或在新代码提交后,检出源树并进行构造。
  • 提供一套排队机制,让多个构造任务可以共享构造机器资源池,当有足够数量的可用机器时,即启动下一个构造任务。
  • 在构造开始、完成、成功或失败时,向各种群组的用户发送电子邮件通知信息。
  • 提供一套图形用户界面,显示构造何时开始、是否成功或失败等状态。
  • 对版本号进行管理,在每次构造成功后递增版本号的值。
  • 在归档目录中存档可供测试人员使用的最终软件包。
  • 在构造成功之后启动及健全性检测。
  • 能够识别开发人员黑名单,即最近检入错误代码的开发人员的名单。

举例

  • Build Forge
  • ElectricCommander
  • CruiseControl
  • Hudson
  • jenkins

5 构造软件的质量

好的构造系统应当具备以下特征:

  • 易用性
  • 正确性
  • 性能
  • 可伸缩性